home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / math / elefunt / tatan.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  8.0 KB  |  324 lines

  1. /* -*-C-*- tatan.c */
  2.  
  3. #include "elefunt.h"
  4.  
  5. /*
  6. #     program to test atan, atan2
  7. #
  8. #     data required
  9. #
  10. #        none
  11. #
  12. #     subprograms required from this package
  13. #
  14. #        machar - an environmental inquiry program providing
  15. #                 information on the floating-point arithmetic
  16. #                 system.  note that the call to machar can
  17. #                 be deleted provided the following six
  18. #                 parameters are assigned the values indicated
  19. #
  20. #                 ibeta  - the radix of the floating-point system
  21. #                 it     - the number of base-ibeta digits in the
  22. #                          significand of a floating-point number
  23. #                 irnd   - 0 if floating-point addition chops,
  24. #                          1 if floating-point addition rounds
  25. #                 minexp - the largest in magnitude negative
  26. #                          integer such that float(ibeta)**minexp
  27. #                          is a positive floating-point number
  28. #                 xmin   - the smallest non-vanishing floating-point
  29. #                          power of the radix
  30. #                 xmax   - the largest finite floating-point no.
  31. #
  32. #        ran(k) - a function subprogram returning random real
  33. #                 numbers uniformly distributed over (0,1)
  34. #
  35. #     standard fortran subprograms required
  36. #
  37. #         abs, alog, amax1, atan, atan2, float, sqrt
  38. #
  39. #
  40. #     latest revision - december 6, 1979
  41. #
  42. #     author - w. j. cody
  43. #              argonne national laboratory
  44. #
  45. #*/
  46.  
  47. void
  48. tatan()
  49. {
  50.     int i,
  51.         k,
  52.         ibeta,
  53.         iexp,
  54.         irnd,
  55.         it,
  56.         i1,
  57.         j,
  58.         k1,
  59.         k2,
  60.         k3,
  61.         machep,
  62.         maxexp,
  63.         minexp,
  64.         n,
  65.         negep,
  66.         ngrd;
  67.     float a,
  68.         ait,
  69.         albeta,
  70.         b,
  71.         beta,
  72.         betap,
  73.         del,
  74.         em,
  75.         eps,
  76.         epsneg,
  77.         expon,
  78.         half,
  79.         ob32,
  80.         r6,
  81.         r7,
  82.         sum,
  83.         w,
  84.         x,
  85.         xl,
  86.     xmax,
  87.         xmin,
  88.         xn,
  89.         xsq,
  90.         x1,
  91.         y,
  92.         z,
  93.         zz;
  94.  
  95.     machar(&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
  96.        &maxexp, &eps, &epsneg, &xmin, &xmax);
  97.     beta = (float) ibeta;
  98.     albeta = ALOG(beta);
  99.     ait = (float) it;
  100.     half = 0.5e0L;
  101.     a = -0.0625e0L;
  102.     b = -a;
  103.     ob32 = b * half;
  104.     n = 2000;
  105.     xn = (float) n;
  106.     i1 = 0;
  107.  
  108.     /* random argument accuracy tests */
  109.  
  110.     for (j = 1; j <= 4; ++j)
  111.     {
  112.     k1 = 0;
  113.     k3 = 0;
  114.     x1 = ZERO;
  115.     r6 = ZERO;
  116.     r7 = ZERO;
  117.     del = (b - a) / xn;
  118.     xl = a;
  119.  
  120.     for (i = 1; i <= n; ++i)
  121.     {
  122.         x = del * ran(i1) + xl;
  123.         if (j == 2)
  124.         x = ((1.0e0L + x * a) - ONE) * 16.0e0L;
  125.         z = atan(x);
  126.         if (j == 1)
  127.         {
  128.         xsq = x * x;
  129.         em = 17.0e0L;
  130.         sum = xsq / em;
  131.  
  132.         for (k = 1; k <= 7; ++k)
  133.         {
  134.             em = em - TWO;
  135.             sum = (ONE / em - sum) * xsq;
  136.         }
  137.  
  138.         sum = -x * sum;
  139.         zz = x + sum;
  140.         sum = (x - zz) + sum;
  141.         if (irnd == 0)
  142.             zz = zz + (sum + sum);
  143.         }
  144.         else
  145.         if (j != 2)
  146.         {
  147.         z = z + z;
  148.         y = x / ((half + x * half) * ((half - x) + half));
  149.         zz = atan(y);
  150.         }
  151.         else
  152.         {
  153.         y = x -.0625e0L;
  154.         y = y / (ONE + x * a);
  155.         zz = (atan(y) - 8.1190004042651526021e-5L) + ob32;
  156.         zz = zz + ob32;
  157.         }
  158.         w = ONE;
  159.         if (z != ZERO)
  160.         w = (z - zz) / z;
  161.         if (w > ZERO)
  162.         k1 = k1 + 1;
  163.         if (w < ZERO)
  164.         k3 = k3 + 1;
  165.         w = ABS(w);
  166.         if (w > r6)
  167.         {
  168.         r6 = w;
  169.         x1 = x;
  170.         }
  171.         r7 = r7 + w * w;
  172.         xl = xl + del;
  173.     }
  174.  
  175.     k2 = n - k3 - k1;
  176.     r7 = sqrt(r7 / xn);
  177.     if (j == 1)
  178.         printf("\fTEST OF ATAN(X) VS TRUNCATED TAYLOR SERIES\n\n");
  179.     else if (j == 2)
  180.         printf(
  181.         "\fTEST OF ATAN(X) VS ATAN(1/16) + ATAN((X-1/16)/(1+X/16))\n\n");
  182.     else if (j > 2)
  183.         printf("\fTEST OF 2*ATAN(X) VS ATAN(2X/(1-X*X))\n\n");
  184.     printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n",n);
  185.     printf("      (" F15P4E "," F15P4E ")\n\n\n", a, b);
  186.     printf(" ATAN(X) WAS LARGER%6d TIMES,\n", k1);
  187.     printf("             AGREED%6d TIMES, AND\n", k2);
  188.     printf("        WAS SMALLER%6d TIMES.\n\n", k3);
  189.     printf(
  190. " THERE ARE%4d BASE%4d SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER\n\n",
  191.         it, ibeta);
  192.     w = -999.0e0;
  193.     if (r6 != ZERO)
  194.         w = ALOG(ABS(r6)) / albeta;
  195.     printf(" THE MAXIMUM RELATIVE ERROR OF" F15P4E " = %4d **" F7P2F "\n",
  196.         r6, ibeta, w);
  197.     printf("    OCCURRED FOR X =" F17P6E "\n", x1);
  198.     w = AMAX1(ait + w, ZERO);
  199.     printf(
  200.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  201.         ibeta, w);
  202.     w = -999.0e0;
  203.     if (r7 != ZERO)
  204.         w = ALOG(ABS(r7)) / albeta;
  205.     printf(" THE ROOT MEAN SQUARE RELATIVE ERROR WAS" F15P4E " = %4d **" F7P2F "\n",
  206.         r7, ibeta, w);
  207.     w = AMAX1(ait + w, ZERO);
  208.     printf(
  209.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  210.         ibeta, w);
  211.     a = b;
  212.     if (j == 1)
  213.         b = TWO - sqrt(3.0e0L);
  214.     else if (j == 2)
  215.         b = sqrt(TWO) - ONE;
  216.     else if (j == 3)
  217.         b = ONE;
  218.     }
  219.  
  220.     /* special tests */
  221.  
  222.     printf("\fSPECIAL TESTS\n\n");
  223.     printf(" THE IDENTITY   ATAN(-X) = -ATAN(X)   WILL BE TESTED.\n\n\n");
  224.     printf("        X         F(X) + F(-X)\n\n");
  225.     a = 5.0e0L;
  226.  
  227.     for (i = 1; i <= 5; ++i)
  228.     {
  229.     x = ran(i1) * a;
  230.     z = atan(x) + atan(-x);
  231.     printf(F15P7E F15P7E "\n\n", x, z);
  232.     }
  233.  
  234.     printf(" THE IDENTITY ATAN(X) = X , X SMALL, WILL BE TESTED.\n\n\n");
  235.     printf("        X         X - F(X)\n\n");
  236.     betap = ipow(beta, it);
  237.     x = ran(i1) / betap;
  238.  
  239.     for (i = 1; i <= 5; ++i)
  240.     {
  241.     z = x - atan(x);
  242.     printf(F15P7E F15P7E "\n\n", x, z);
  243.     x = x / beta;
  244.     }
  245.  
  246.     printf(" THE IDENTITY ATAN(X/Y) = ATAN2(X,Y) WILL BE TESTED\n");
  247.     printf(" THE FIRST COLUMN OF RESULTS SHOULD BE 0, THE SECOND +-PI\n\n");
  248.     printf("        X             Y     F1(X/Y)-F2(X,Y)F1(X/Y)-F2(X/(-Y))\n");
  249.     a = -TWO;
  250.     b = 4.0e0L;
  251.  
  252.     for (i = 1; i <= 5; ++i)
  253.     {
  254.     x = ran(i1) * b + a;
  255.     y = ran(i1);
  256.     w = -y;
  257.     z = atan(x / y) - atan2(x, y);
  258.     zz = atan(x / w) - atan2(x, w);
  259.     printf(F15P7E F15P7E F15P7E F15P7E "\n\n", x, y, z, zz);
  260.     }
  261.  
  262.     printf(" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT.\n\n");
  263.     expon = (float) minexp *0.75e0L;
  264.     x = pow(beta, expon);
  265.     y = atan(x);
  266.     printf("       ATAN(" F13P6E ") =" F13P6E "\n", x, y);
  267.  
  268.     /* test of error returns */
  269.  
  270.     printf("\fTEST OF ERROR RETURNS\n\n\n");
  271.  
  272.     printf(" ATAN WILL BE CALLED WITH THE ARGUMENT" F15P7E "\n", xmax);
  273.     printf(" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE\n\n\n");
  274.     fflush(stdout);
  275.     errno = 0;
  276.     z = atan(xmax);
  277.     if (errno)
  278.     perror("atan()");
  279.     printf("       ATAN(" F13P6E ") =" F13P6E "\n", xmax, z);
  280.  
  281.     x = ONE;
  282.     y = ZERO;
  283.     printf(" ATAN2 WILL BE CALLED WITH THE ARGUMENTS\n" F15P7E F15P7E "\n\n", x, y);
  284.     printf(" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE\n\n\n");
  285.     fflush(stdout);
  286.     errno = 0;
  287.     z = atan2(x, y);
  288.     if (errno)
  289.     perror("atan2()");
  290.     printf("       ATAN2(" F13P6E F13P6E ") =" F13P6E "\n", x, y, z);
  291.  
  292.     printf(" ATAN2 WILL BE CALLED WITH THE ARGUMENTS\n" F15P7E F15P7E "\n\n",
  293.     xmin, xmax);
  294.     printf(" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE\n\n\n");
  295.     fflush(stdout);
  296.     errno = 0;
  297.     z = atan2(xmin, xmax);
  298.     if (errno)
  299.     perror("atan2()");
  300.     printf("       ATAN2(" F13P6E F13P6E ") =" F13P6E "\n", xmin, xmax, z);
  301.  
  302.     printf(" ATAN2 WILL BE CALLED WITH THE ARGUMENTS\n" F15P7E F15P7E "\n\n",
  303.     xmax, xmin);
  304.     printf(" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE\n\n\n");
  305.     fflush(stdout);
  306.     errno = 0;
  307.     z = atan2(xmax, xmin);
  308.     if (errno)
  309.     perror("atan2()");
  310.     printf("       ATAN2(" F13P6E F13P6E ") =" F13P6E "\n", xmax, xmin, z);
  311.  
  312.     x = ZERO;
  313.     printf(" ATAN2 WILL BE CALLED WITH THE ARGUMENTS\n" F15P7E F15P7E "\n\n", x, y);
  314.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  315.     fflush(stdout);
  316.     errno = 0;
  317.     z = atan2(x, y);
  318.     if (errno)
  319.     perror("atan2()");
  320.     printf("       ATAN2(" F13P6E F13P6E ") =" F13P6E "\n", x, y, z);
  321.  
  322.     printf(" THIS CONCLUDES THE TESTS\n");
  323. }
  324.